In [ ]:
import openni as opi
import numpy as np
import pygame
from pygame.locals import KEYDOWN, K_ESCAPE
from pygame.color import THECOLORS
import Image
from random import randrange

Create context and generators


In [ ]:
ctx = opi.Context()
ctx.init()

In [ ]:
depth_generator = opi.DepthGenerator()
depth_generator.create(ctx)
depth_generator.set_resolution_preset(opi.RES_VGA)
depth_generator.fps = 30

image_generator = opi.ImageGenerator()
image_generator.create(ctx)

hands_generator = opi.HandsGenerator()
hands_generator.create(ctx)

gesture_generator = opi.GestureGenerator()
gesture_generator.create(ctx)
gesture_generator.add_gesture('Wave')

Write some callbalks ...


In [ ]:
def gesture_detected(src, gesture, id, end_point):
    hands_generator.start_tracking(end_point)

def gesture_progress(src, gesture, point, progress): 
    print "Dave is waving !!", src

def create(src, id, pos, time):
    try:
        hands[id] = Hand(file_names[randrange(len(file_names))])
        sprites.add(hands[id])
    except KeyError:
        print "you have this hand already"
    
def update(src, id, pos, time):
    if pos:
        tmp_pos = depth_generator.to_projective([pos])[0]
        hands[id].rect.centerx, hands[id].rect.centery = tmp_pos[0], tmp_pos[1] 

def destroy(src, id, time):
    sprites.remove(hands[id])
    del hands[id]

And register them ...


In [ ]:
gesture_generator.register_gesture_cb(gesture_detected, gesture_progress)
hands_generator.register_hand_cb(create, update, destroy)

Some things for this particular demo ...


In [ ]:
hands = {}
file_names = ['Images/mano_1.png', 'Images/mano_2.png']

In [ ]:
class Hand(pygame.sprite.Sprite):
    """Hand Class for set image, speed and angle """
    def __init__(self, image):
        pygame.sprite.Sprite.__init__(self)
        self.img_load(image)
        
    def img_load(self, filename):
        self.image = pygame.image.load(filename)
        self.image = pygame.transform.scale(self.image, (60,60))  
        self.rect = self.image.get_rect()

To display the camera ...


In [ ]:
def capture_rgb():
    rgb_frame = np.fromstring(image_generator.get_raw_image_map_bgr(),
                              dtype=np.uint8).reshape(480, 640, 3)
    
    im = Image.fromarray(rgb_frame)
    b, g, r = im.split()
    im = Image.merge("RGB", (r, g, b))

    return pygame.image.frombuffer(im.tostring(), im.size, 'RGB')

The main loop ...


In [ ]:
pygame.init()
running = True
screen = pygame.display.set_mode((640, 480), pygame.HWSURFACE | pygame.DOUBLEBUF)
pygame.display.set_caption('My First Hand Tracking')
sprites = pygame.sprite.RenderUpdates()
ctx.start_generating_all()

while running:
    for event in pygame.event.get():
        if event.type == KEYDOWN and event.key == K_ESCAPE: running = False
    ctx.wait_any_update_all()
    
    screen.blit(capture_rgb(), (0, 0))
    map(lambda i: i.update(), hands.values())
    dirty = sprites.draw(screen)
    pygame.display.update(dirty)
    pygame.display.flip()
    
pygame.display.quit()
pygame.quit()

Then we stop and close the context


In [ ]:
ctx.stop_generating_all()
ctx.shutdown()